package learn.up.generic;

import java.math.BigDecimal;

public class BigDecimalTest {
/*

    JDK的描述：1、参数类型为double的构造方法的结果有一定的不可预知性。
    有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1（非标度值 1，其标度为 1），
    但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准
    确地表示为 double（或者说对于该情况，不能表示为任何有限长度的二进制小数）。这样，传入到构造方法的值不会正好等于 0.1（虽然表面上等于该值）。

    2、另一方面，String 构造方法是完全可预知的：写入 newBigDecimal("0.1") 将创建一个 BigDecimal，
    它正好等于预期的 0.1。因此，比较而言，通常建议优先使用String构造方法。

    3、当double必须用作BigDecimal的源时，请注意，此构造方法提供了一个准确转换；
    它不提供与以下操作相同的结果：先使用Double.toString(double)方法，然后使用
    BigDecimal(String)构造方法，将double转换为String。要获取该结果，请使用static valueOf(double)方法。
    
    总结：
    (1)商业计算使用BigDecimal。
    (2)尽量使用参数类型为String的构造函数。
    (3) BigDecimal都是不可变的（immutable）的，在进行每一步运算时，都会产生一个新的对象，所以在做加减乘除运算时千万要保存操作后的值。
    (4)我们往往容易忽略JDK底层的一些实现细节，导致出现错误，需要多加注意。
 */
	public static void main(String[] args) {
		BigDecimal bd = new BigDecimal("1.2");
		System.out.println(bd);
		BigDecimal bd2 = new BigDecimal(1.2);
		System.out.println(bd2);
		System.out.println(Long.MIN_VALUE);
		System.out.println(1 ^ 7*6);
	}

}
